require 'singleton'
require 'model/connection'
require 'model/eleicao'
require 'controller/bool'
require "view/eleicao_view"

class EleicaoDao
  
  include Singleton

  def initialize
    self
  end

=begin
Author  : atila camurca
Date    : 08/05/2010
Version : 1.0
Return  : #self
Description
   Cria uma nova eleição.
Parameters
  presidente #Eleitor : presidente da seção eleitoral.
=end
  def save(presidente)
    begin
      sql = "insert into eleicao (presidente, inicio_eleicao, em_andamento) values (?, current_timestamp, 'TRUE')"
      conn = Connection.instance.get_conn
      conn.execute(sql, presidente.titulo)
      # TODO: procurar como retornar as linhas afetadas. Ver se retorna o valor correto.
      return conn.last_insert_row_id
    rescue Exception
      return PollerException.instance.throw(conn.errmsg, "[DAO] Eleição não pode ser criada.")
    end
  end

=begin
Author  : atila camurca
Date    : 09/05/2010
Version : 1.0
Return  : #Integer, ou #nil se não foi possível encontrar.
Description
   Encontra a última eleição em aberto.
=end
  def find_ultima_eleicao
    sql = "select max(id) from eleicao"
    conn = Connection.instance.get_conn
    id = conn.get_first_value(sql)
    #Connection.instance.close_conn
    return id
  end

=begin
Author  : atila camurca
Date    : 09/05/2010
Version : 1.0
Return  : #Boolean
Description
   Verifica se a eleição esta em andamento.
=end
  def eleicao_em_andamento?
    sql = "select em_andamento from eleicao where id = ?"
    conn = Connection.instance.get_conn
    bool = conn.get_first_value(sql, EleicaoView.instance.get_eleicao)
    return Bool.to_b(bool)
  end

  def inicio_eleicao?
    sql = "select inicio_eleicao from eleicao where id = ?"
    conn = Connection.instance.get_conn
    return conn.get_first_value(sql, EleicaoView.instance.get_eleicao)
  end

  def fim_eleicao?
    sql = "select fim_eleicao from eleicao where id = ?"
    conn = Connection.instance.get_conn
    return conn.get_first_value(sql, EleicaoView.instance.get_eleicao)
  end

  def find_all
    sql = "select inicio_eleicao, presidente from eleicao"
    conn = Connection.instance.get_conn
    rst = conn.query(sql)
    a_eleicao = Array.new
    rst.each do |row|
      eleicao = Eleicao.new(row[0], row[1])
      a_eleicao.push eleicao
    end
    rst.close
    #Connection.instance.close_conn
    return a_eleicao
  end

  def encerrar_eleicao
    sql = "update eleicao set fim_eleicao = current_timestamp, em_andamento = 'FALSE' where id = ?"
    conn = Connection.instance.get_conn
    conn.execute(sql, EleicaoView.instance.get_eleicao)
    self
  end

  def delete_all
    begin
      sql = "delete from eleicao"
      conn = Connection.instance.get_conn
      conn.execute(sql)
      self
    rescue Exception
      PollerException.instance.throw(conn.errmsg, "[DAO] Erro ao deletar Eleições.")
    end
  end

end
